package br.com.beans;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import br.com.dao.ConvenioDAO;
import br.com.dao.EspecialidadeDAO;
import br.com.dao.ItemSaudeDAO;
import br.com.dao.TabelaPrecosDAO;

/** Classe que representa a tabela precos vigente,
 *  para os itens de saude cadastrados.
 */
@Entity
@Table(name="tb_precos")
public class TabelaPrecos {

	/** Id do item da tabela de precos */
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(nullable=false)
	private int id;

	/** Convenio */
	@ManyToOne
    @JoinColumn(name="codigoConvenio",nullable=true)
	private Convenio convenio = new Convenio();

	/** Especialidade */
	@ManyToOne
    @JoinColumn(name="codigoEspecialidade",nullable=true)
	private Especialidade especialidade = new Especialidade();
	
	/** Item de Saude */
	@ManyToOne
    @JoinColumn(name="codigoItemSaude",nullable=false)
	private ItemSaude itemSaude = new ItemSaude();
	
	/** Valor (preco) do item */
	@Column(nullable=false)
	private float valor;
	
	/** Construtor padrao */
	public TabelaPrecos() {}

	/** Construtor de copia */
	public TabelaPrecos(TabelaPrecos tabelaPrecos) {
		copiar(tabelaPrecos);
	}

	/** Limpa todos atributos. */
	public void limpar() {
		setId(0);
		setConvenio(new Convenio());
		setEspecialidade(new Especialidade());
		setItemSaude(new ItemSaude());
		setValor(0.0f);
	}
	
	/** Copia atributos de outro objeto.
	 *  @param obj Objeto a ser copiado */
	public void copiar(TabelaPrecos obj) {
		if (obj != null) {
			//setId(obj.getId());
			setConvenio(new Convenio(obj.getConvenio()));
			setEspecialidade(new Especialidade(obj.getEspecialidade()));
			setItemSaude(new ItemSaude(obj.getItemSaude()));
			setValor(obj.getValor());
		} else {
			limpar();
		}
	}
	
	/** Cadastra um item na tabela de precos. */
	public void cadastrar() {
		TabelaPrecosDAO  tabelaPrecosDAO  = new TabelaPrecosDAO();
		ItemSaudeDAO     itemSaudeDAO     = new ItemSaudeDAO();
		EspecialidadeDAO especialidadeDAO = new EspecialidadeDAO();
		ConvenioDAO      convenioDAO      = new ConvenioDAO();
		FacesMessage facesMessage = null;

		TabelaPrecos itemTabela = new TabelaPrecos(this);
		
		ItemSaude itemSaudeObj = itemSaudeDAO.localizar(getItemSaude().getDescricao());
		itemTabela.setItemSaude(itemSaudeObj);
		
		Especialidade especialidadeObj = especialidadeDAO.localizar(getEspecialidade().getDescricao());
		itemTabela.setEspecialidade(especialidadeObj);
		
		Convenio convenioObj = convenioDAO.localizar(getConvenio().getDescricao());
		itemTabela.setConvenio(convenioObj);
		
		if (tabelaPrecosDAO.inserir(itemTabela)) {
			facesMessage = new FacesMessage("Item adicionado com sucesso.",null);  
			limpar();
		} else {
			facesMessage = new FacesMessage("Erro ao adicionar item.",null);  
		}
		FacesContext.getCurrentInstance().addMessage(null,facesMessage);  
	}

	/** Remove um item da tabela de precos. */
	public void remover() {
		TabelaPrecosDAO tabelaPrecosDAO = new TabelaPrecosDAO();
		FacesMessage facesMessage = null;

		if (tabelaPrecosDAO.excluir(getId())) {
			facesMessage = new FacesMessage("Item removido com sucesso da tabela de precos.",null);  
		} else {
			facesMessage = new FacesMessage("Erro ao remover item da tabela de precos.",null);  
		}
		limpar();
		FacesContext.getCurrentInstance().addMessage(null,facesMessage);  
	}
	
	/** Retorna uma lista de items da tabela de precos.
	 * @return Lista de items da tabela de precos. */
	public List<TabelaPrecos> getLista() {
		TabelaPrecosDAO tabelaPrecosDAO = new TabelaPrecosDAO();
		return tabelaPrecosDAO.listar(getConvenio().getDescricao(),
									  getEspecialidade().getDescricao(),
									  getItemSaude().getDescricao());
	}
	
	public Convenio getConvenio() {
		return this.convenio;
	}

	public void setConvenio(Convenio convenio) {
		this.convenio = convenio;
	}

	public ItemSaude getItemSaude() {
		return this.itemSaude;
	}

	public void setItemSaude(ItemSaude itemSaude) {
		this.itemSaude = itemSaude;
	}

	public Especialidade getEspecialidade() {
		return this.especialidade;
	}

	public void setEspecialidade(Especialidade especialidade) {
		this.especialidade = especialidade;
	}

	public float getValor() {
		return valor;
	}

	public void setValor(float valor) {
		this.valor = valor;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

}
